# -*- coding: utf-8 -*-
# File : student.py
# Author: taoyahui
# Date : 2022/5/9
import sqlite3
import os


def quit():
    """
    当输入为"exit" "quit"时使用的结束程序函数
    :return:
    """
    print("谢谢您的使用，再见！")
    exit(0)


def clear():
    """
    清屏
    :return:
    """
    os.system('clear')


def main_menu():
    """
    获取用户键入的命令内容并返回
    :return: command -> 用户命令
    """
    menu = '''这是程序主架构练习的操作'''
    print(menu)
    command = input('>> ')
    return command


def exec_sql(sql):
    """
    实现与数据库交互使用(操作数据库的基础部件，也是核心件)
    :param sql:
    :return:
    """
    # 第一步，创建连接
    conn = sqlite3.connect("students.db")

    # 第二步，创建游标
    cursor = conn.cursor()

    # 第三步，执行sql
    try:
        cursor.execute(sql)
        result = cursor.fetchall()
        # 这里是提交操作
        conn.commit()
        return result
    except BaseException as e:
        # 如果进入这里，就说明有异常，需要进行回滚操作
        conn.rollback()
        print(f'错误: {e}')
    finally:
        # 关闭连接
        conn.close()

def show_all():
    """
    查看student表所有的内容
    :return:
    """
    results = exec_sql("SELECT * FROM student")
    show_student(results)


def search():
    """
    根据条件查询学生信息
    :return:
    """
    where_condition = '''请输入查询条件：
            1   :   按编号查询;
            2   :   按姓名查询;
            3   :   按性别查询;
            4   :   按学号查询;
            5   :   按班级查询;
            6   :   按学院查询;
            exit:   退出
    查询条件： '''
    where = -1
    while True:
        condition = input(where_condition)
        if condition == 'exit':
            # 如果condition是exit的话就退出查询
            return
        if condition.isdigit():
            where = int(condition)
            if 1 <= where <= 6 : # where >= 1 and where <=6
                break
        print("输入有误，请重新输入！")
    condition = input('请输入查询条件的值：')
    conditions = ['id', 'name', 'gender', 'student_id', 'class_name', 'college_name']
    results = exec_sql(f"select * from student where {conditions[where - 1]} = '{condition}'")
    if results:
        show_student(results)
    else:
        print("学生未找到！\n")


def change():
    show_all()
    # 首先输入需要修改学生信息的id
    student_id = input("当前只支持根据学生ID进行修改，请输入要修改的学生ID：")
    # 然后输入针对这个id索要修改的字段
    field_hint = '''请输入要修改的字段：
            1   :   学生姓名
            2   :   学生性别
            3   :   学生学号
            4   :   学生班级
            5   :   学生学院
            exit:   退出
    要修改的字段是：'''
    while True:
        field = input(field_hint)
        if field == 'exit':
            return
        if field.isdigit():
            field_number = int(field)
            if 1 <= field_number <= 5:
                break
        print("输入有误，请重新输入！")
    value = input("请输入要修改的值：")
    conditions = ['id', 'name', 'gender', 'student_id', 'class_name', 'college_name']
    exec_sql("update student set %s = '%s' where id = %s" % (conditions[field_number], value, student_id))
    print("修改成功！")
    results = exec_sql("select * from student where id = %s" % student_id)
    if results:
        show_student(results)


def delete():
    show_all()
    student_id = input("当前只支持根据学生ID删除学生，请输入要删除的学生ID：")
    exec_sql('delete from student where id = %s' % student_id)
    print('删除成功！')
    show_all()


def add():
    name = input("学生姓名：")
    gender = input("性别（男，女）：")
    student_id = input("学生ID：")
    class_name = input("班级名：")
    college_name = input("学院名：")
    exec_sql("insert into student values(null,'%s','%s','%s','%s','%s')" % (
        name, gender, student_id, class_name, college_name))
    print("插入成功！")
    results = exec_sql("select * from student where student_id = '%s'" % student_id)
    if results:
        show_student(results)


def show_student(results):
    print('-' * 100)
    print("{0}\t{1}\t{2}\t{3}\t\t{4}\t\t{5}".format('编号', '姓名', '性别', '学号', '班级', '学院'))
    for result in results:
        print("{0}\t{1}\t{2}\t{3}\t{4}\t\t{5}".format(result[0], result[1], result[2], result[3], result[4], result[5]))
    print('-' * 100)


def show_help():
    help_str = '''
    show        :   查看所有学生；
    search      :   按条件筛选学生；
    add         :   添加学生；
    change      :   修改学生信息；
    delete      ：  删除指定学生；
    help        :   打印帮助信息；
    clear       ：  清屏；
    quit        ：  退出；
    exit        ：  退出；
    '''
    print(help_str)

def main_menu():
    menu = '''欢迎使用学生信息管理系统（版本号 v1.0）
    请在>>之后输入指令（help打印帮助）'''
    print(menu)
    command = input(">> ")
    return command


def main():
    commands = {
        'quit': quit,
        'exit': quit,
        'help': show_help,
        'show': show_all, # 查询所有学生信息
        'search': search,
        'change': change,
        'delete': delete,
        'add': add,
        'clear': clear
    }

    while True:
        command = main_menu()
        if not command in commands:
            print("指令未找到，请重新输入！")
            show_help()
        else:
            (commands.get(command))()


if __name__ == '__main__':
    main()



